use rand::Rng;
use std::cmp::Ordering;
use std::io;
use std::{thread, time};


// 结构体
struct User {
    active: bool,
    // 使用了自身拥有所有权的 String 类型而不是 &str 字符串 slice 类型。
    // 因为我们想要这个结构体拥有它所有的数据，为此只要整个结构体是有效的话其数据也是有效的。
    username: String,
    // 生命周期确保结构体引用的数据有效性跟结构体本身保持一致。
    // 如果你尝试在结构体中存储一个引用而不指定生命周期将是无效的
    // email: &str,  错误的
    email: String,
    sign_in_count: u64,
}

// 元组结构体
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

// 类单元结构体（unit-like structs）:没有任何字段的类单元结构体
struct AlwaysEqual;


pub fn example_structs_example() {
    println!("#################################");
    println!("#################################");
    println!("example_structs.");

    let user1 = build_user(String::from("hangsan@163.com"), String::from("hangsan"));
    println!("user1 email:{}, user1 name :{}", user1.email, user1.username);

    let user2 = User {
        email: String::from("another@example.com"),

        username: user1.username.clone(),  //  不加此方法会导致 user1 后续不能再被使用
        // 基本类型是实现 Copy trait 的类型
        ..user1
    };
    println!("user2 email:{}, user2 name :{}", user2.email, user2.username);
    // println!("user1 email:{}, user1 name :{}", user1.email, user1.username);

    let mut runoob = User {
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        active: true,
        sign_in_count: 1,
    };

    // 改变值
    runoob.email = String::from("anotheremail@example.com");
    // 获取值
    println!("runoob email:{}, runoob name :{}", runoob.email, runoob.username);

    // 元组结构体
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
    println!("black0:{}.", black.0);

    let subject = AlwaysEqual;
    let subject1 = AlwaysEqual;
    let subject2 = AlwaysEqual;
    // do nothings

}

fn build_user(email: String, username: String) -> User {
    User {
        email: email,
        username: username,
        active: true,
        sign_in_count: 1,
    }
}
